
<!DOCTYPE HTML PUBLIC "-//IETF//DTD HTML//EN">
<html>
<head>
<script src="../../resources/js-test.js"></script>
</head>
<body>
<script>
description("Tests the RTCPeerConnection stats interface.");

var pc = null;
var result;

function getUserMedia(dictionary, callback) {
    try {
        navigator.webkitGetUserMedia(dictionary, callback, error);
    } catch (e) {
        testFailed('webkitGetUserMedia threw exception :' + e);
        finishJSTest();
    }
}

function error() {
    testFailed('Stream generation failed.');
    finishJSTest();
}

function verifyStats(status)
{
    // Note that this function verifies "old-style" stats, not the
    // standardized version.
    // Status must be a global variable to be used in test statements.
    status_g = status;
    result = status.result();
    shouldBeGreaterThanOrEqual('result.length', '2');
    // Windows XP sometimes gives time that appears to go backwards.
    // This hack will make the tests non-flaky if it never goes backwards
    // by more than 20 milliseconds.
    // Up to 10 milliseconds has been observed on XP, 2 milliseconds on Win7.
    fudgeForXP = 20;
    res = result[0];
    timediff = res.timestamp - startTime + fudgeForXP;
    shouldBeGreaterThanOrEqual('timediff', '0');
    shouldBeNonNull('res.id');
    shouldBeNonNull('res.type');
    shouldBeGreaterThanOrEqual('res.names().length', '1');
    // TODO(hta): Look up the stat of the right type name to check it.
    // shouldBeGreaterThanOrEqual('res.names().indexOf("type")', '0');
    // shouldBe('res.stat("type")', '"audio"');
    // Named getter: Can access results by their ID values.
    shouldBeNonNull('status_g.namedItem(res.id)');
    shouldBeNonNull('status_g[res.id]');
}

function statsHandler1(status)
{
    testPassed("statsHandler1 was called");
    shouldBeNonNull('status');
    result = status.result();
    shouldBeGreaterThanOrEqual('result.length', '0');
    shouldNotThrow('getUserMedia({audio:true, video:true}, gotStream)');
}

function gotStream(s) {
    testPassed('Got a stream.');
    stream = s;

    pc.addStream(stream);
    shouldNotThrow('pc.getStats(statsHandler2)');
}

function statsHandler2(status)
{
    testPassed("statsHandler2 was called");
    verifyStats(status);
    shouldNotThrow('pc.close()');
    shouldNotThrow('pc.getStats(statsHandler3)');
}

function statsHandler3(status)
{
     testPassed("statsHandler3 was called");
     verifyStats(status);
    // Silly non-MediaStreamTrack second argument should be interpreted as undefined.
    shouldNotThrow('pc.getStats(statsHandler4, 42)');
}

function statsHandler4(status) {
    testPassed("statsHandler4 was called");
    verifyStats(status);
    finishJSTest();
}

var startTime = new Date().getTime();
shouldNotThrow('pc = new RTCPeerConnection()');
shouldNotThrow('pc.getStats(statsHandler1)');

window.jsTestIsAsync = true;
window.successfullyParsed = true;
</script>
</body>
</html>
